/**
 * @file    port.h
 * @brief   FreeModbus移植层核心头文件
 * @details 本文件定义了FreeModbus协议栈在STM32平台上的移植层接口，包括数据类型定义、
 *          编译器相关宏定义、临界区控制宏以及核心函数声明。该文件是整个移植层的基础，
 *          为FreeModbus协议栈提供了与硬件平台无关的抽象接口。
 * 
 * @note 移植层设计说明：
 *       - 使用标准C数据类型重新定义，保证跨平台兼容性
 *       - 提供临界区保护机制，确保多任务环境下的数据一致性
 *       - 支持C++编译环境的extern "C"声明
 *       - 针对ARM Cortex-M系列处理器优化
 */

#ifndef _PORT_H
#define _PORT_H

/* -------------------------- 标准库头文件包含 ---------------------------- */
#include <assert.h>     /* 断言宏定义 */
#include <stdint.h>     /* 标准整数类型定义 */
#include <stdbool.h>    /* 布尔类型定义 */

/* -------------------------- 硬件相关头文件包含 -------------------------- */
/**
 * @note STM32 HAL库头文件
 * 包含STM32F4系列的硬件抽象层定义，提供GPIO、UART、TIM等外设的操作接口
 */
#include "stm32f4xx_hal.h"

/* CMSIS核心头文件（可选，当前使用HAL库替代）
 * 如需直接使用CMSIS接口可取消注释以下行：
 */
// #include "cmsis_compiler.h"
// #include "cmsis_gcc.h"

/* -------------------------- 编译器相关宏定义 ---------------------------- */
#define INLINE                      inline          /* 内联函数修饰符 */
#define PR_BEGIN_EXTERN_C           extern "C" {    /* C++兼容性宏 - 开始extern "C"声明 */
#define PR_END_EXTERN_C             }               /* C++兼容性宏 - 结束extern "C"声明 */

/* -------------------------- 临界区控制宏定义 ---------------------------- */
#define ENTER_CRITICAL_SECTION()    __disable_irq() /* 进入临界区，禁用全局中断 */
#define EXIT_CRITICAL_SECTION()     __enable_irq()  /* 退出临界区，恢复全局中断 */

/* -------------------------- 数据类型重定义 ------------------------------ */
typedef uint8_t         BOOL;       /* 布尔类型，取值 TRUE/FALSE */
typedef unsigned char   UCHAR;      /* 8位无符号字符类型 */
typedef char            CHAR;       /* 8位有符号字符类型 */
typedef uint16_t        USHORT;     /* 16位无符号短整型 */
typedef int16_t         SHORT;      /* 16位有符号短整型 */
typedef uint32_t        ULONG;      /* 32位无符号长整型 */
typedef int32_t         LONG;       /* 32位有符号长整型 */

/* -------------------------- 布尔值常量定义 ------------------------------ */
#ifndef TRUE
#define TRUE            1           /* 逻辑真值 */
#endif

#ifndef FALSE
#define FALSE           0           /* 逻辑假值 */
#endif

/* -------------------------- 核心函数声明 -------------------------------- */

void modbusInit(void);  /* 初始化Modbus协议栈（串口、定时器、事件队列），只能调用一次 */
void modbusPoll(void);  /* Modbus协议栈主循环轮询函数，在主循环中周期性调用 */

#endif /* _PORT_H */
